package top.zhangjianyong.blog.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import top.zhangjianyong.blog.model.request.UploadUrlRequest;
import top.zhangjianyong.blog.model.response.UploadUrlResponse;
import top.zhangjianyong.blog.service.OssService;

/**
 * OSS 控制器
 * 
 * @author zhangjianyong
 * @since 2024-01-01
 */
@Slf4j
@RestController
@RequestMapping("/api/oss")
public class OssController {
    
    @Autowired
    private OssService ossService;
    
    /**
     * 生成上传URL
     * 
     * @param request 上传URL请求参数
     * @return 上传URL响应
     */
    @PostMapping("/upload-url")
    public UploadUrlResponse generateUploadUrl(@RequestBody UploadUrlRequest request) {
        log.info("生成上传URL，文件名: {}, 用户ID: {}", request.getFileName(), request.getUserId());
        return ossService.generateUploadUrl(request);
    }
    
    /**
     * 删除文件
     * 
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    @DeleteMapping("/file")
    public boolean deleteFile(@RequestParam String filePath) {
        log.info("删除文件，文件路径: {}", filePath);
        return ossService.deleteFile(filePath);
    }
    
    /**
     * 获取文件访问URL
     * 
     * @param filePath 文件路径
     * @return 文件访问URL
     */
    @GetMapping("/file-url")
    public String getFileUrl(@RequestParam String filePath) {
        return ossService.getFileUrl(filePath);
    }
    
    /**
     * 获取带签名的文件访问URL
     * 
     * @param filePath 文件路径
     * @param expireSeconds 过期时间（秒）
     * @return 带签名的文件访问URL
     */
    @GetMapping("/signed-url")
    public String getSignedFileUrl(@RequestParam String filePath, 
                                  @RequestParam(defaultValue = "3600") Integer expireSeconds) {
        return ossService.getSignedFileUrl(filePath, expireSeconds);
    }
    
    /**
     * 检查文件是否存在
     * 
     * @param filePath 文件路径
     * @return 文件是否存在
     */
    @GetMapping("/file-exists")
    public boolean fileExists(@RequestParam String filePath) {
        return ossService.fileExists(filePath);
    }
    
    /**
     * 获取文件大小
     * 
     * @param filePath 文件路径
     * @return 文件大小（字节）
     */
    @GetMapping("/file-size")
    public Long getFileSize(@RequestParam String filePath) {
        return ossService.getFileSize(filePath);
    }
    
    /**
     * 复制文件
     * 
     * @param sourcePath 源文件路径
     * @param targetPath 目标文件路径
     * @return 是否复制成功
     */
    @PostMapping("/copy-file")
    public boolean copyFile(@RequestParam String sourcePath, @RequestParam String targetPath) {
        log.info("复制文件，源路径: {}, 目标路径: {}", sourcePath, targetPath);
        return ossService.copyFile(sourcePath, targetPath);
    }
} 